#!/usr/bin/python
#-*- coding: utf-8 -*-
import trees
# 获取数据集
# 数据集格式:列表,每一行包括一系列特征值和标签(标签为最后一个元素)
dataSet, labels = trees.createDataSet()
print(dataSet)
# 特征值的数量(假定每一行数据格式一致)
numFeatures = len(dataSet[0]) - 1
# 原始香农熵
baseEntropy = trees.calcShannonEnt(dataSet)
# 最佳信息增益
bestInfoGain = 0.0
# 最佳信息增益对应的特征索引
bestFeature = -1
# 逐一尝试,找到最佳的划分方案
for i in range(numFeatures):
# 获取特征值的集合
featList = [example[i] for example in dataSet]
uniqueVals = set(featList) # 通过取集合的方式去除重复元素
# 计算总体的香农熵
newEntropy = 0.0
for value in uniqueVals:
# 按给定特征划分数据集
# 原始数据集dataSet,选取索引为i的特征,筛选其值为value的所有项
subDataSet = trees.splitDataSet(dataSet, i , value)
# 权值
prob = len(subDataSet) / float(len(dataSet))
# 累加
newEntropy += prob * trees.calcShannonEnt(subDataSet)
# 计算香农熵增益
infoGain = baseEntropy - newEntropy
# 如果出现更佳的划分方案(香农熵增益更高)
if infoGain > bestInfoGain:
bestInfoGain = infoGain
bestFeature = i
# 结果
print(bestInfoGain)
print(bestFeature)
print(dataSet)
多次寻找最佳划分方案,直到某一分支都属于同一分类或所有特征值都使用完,从而构建出决策树
如果所有特征值都使用完还未能决定出该分支的分类,则采用举手表决的方式决定
myDat, labels = trees.createDataSet()
myTree = trees.createTree(myDat, labels)
print(myTree)